package io.hepu.robotize.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Generics {

    /**
     *  获取泛型类第一个参数类型
     * @param clazz 泛型类
     */
    public static Class<?> getTypeClass(Class<?> clazz) {
        return getTypeClass(clazz, 0);
    }

    /**
     * 获取泛型类的参数类型
     * @param clazz 泛型类
     * @param index 参数索引; 从0开始
     * @throws IndexOutOfBoundsException 越界异常
     */
    public static Class<?> getTypeClass(Class<?> clazz, int index) throws IndexOutOfBoundsException {
        Type type = clazz.getGenericSuperclass();
        if (!(type instanceof ParameterizedType)) {
            return Object.class;
        }
        Type[] args = ((ParameterizedType) type).getActualTypeArguments();
        if (index >= args.length || index < 0) {
            return Object.class;
        }
        if (!(args[index] instanceof Class)) {
            return Object.class;
        }
        return (Class<?>) args[index];
    }
}
